package com.qaml.mes.device.dao.component;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.earth.user.AuthSsoContext;
import com.earth.user.SsoLoginUser;
import com.qaml.mes.device.dao.BaseDO;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Objects;

/**
 * @ClassName DefaultDBFieldHandler
 * @Description 通用参数填充实现类
 * <p>
 * 如果没有显式的对通用参数进行赋值，这里会对通用参数进行填充、赋值
 * @Author leikai
 * @Date 2023/12/6 13:10
 * @Version 1.0
 */
@Component
public class DefaultDBFieldHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) {
            BaseDO baseDO = (BaseDO) metaObject.getOriginalObject();

            Date current = new Date();
            // 创建时间为空，则以当前时间为插入时间
            if (Objects.isNull(baseDO.getCreateTime())) {
                baseDO.setCreateTime(current);
            }
            // 更新时间为空，则以当前时间为更新时间
            if (Objects.isNull(baseDO.getUpdateTime())) {
                baseDO.setUpdateTime(current);
            }

            if (Objects.isNull(baseDO.getIsDeleted())) {
                baseDO.setIsDeleted(0);
            }

            SsoLoginUser ssoLoginUser = AuthSsoContext.getSsoLoginUser();

            // 当前登录用户不为空，创建人为空，则当前登录用户为创建人
            if (Objects.nonNull(ssoLoginUser) && Objects.isNull(baseDO.getCreateUser())) {
                baseDO.setCreateUser(ssoLoginUser.getUserId());
            }

            if (Objects.nonNull(ssoLoginUser) && Objects.isNull(baseDO.getCreateUserName())) {
                baseDO.setCreateUserName(ssoLoginUser.getUserName());
            }
            // 当前登录用户不为空，更新人为空，则当前登录用户为更新人
            if (Objects.nonNull(ssoLoginUser) && Objects.isNull(baseDO.getUpdateUser())) {
                baseDO.setUpdateUser(ssoLoginUser.getUserId());
            }
            if (Objects.nonNull(ssoLoginUser) && Objects.isNull(baseDO.getUpdateUserName())) {
                baseDO.setUpdateUserName(ssoLoginUser.getUserName());
            }

        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {

        // 更新时间为空，则以当前时间为更新时间
        if (metaObject.hasGetter("updateTime")) {

            setFieldValByName("updateTime", new Date(), metaObject);
        }

        SsoLoginUser ssoLoginUser = AuthSsoContext.getSsoLoginUser();

        // 当前登录用户不为空，更新人为空，则当前登录用户为更新人
        if (Objects.nonNull(ssoLoginUser) && metaObject.hasGetter("updateUser")) {
            setFieldValByName("updateUser", ssoLoginUser.getUserId(), metaObject);
        }


        if (Objects.nonNull(ssoLoginUser) && metaObject.hasGetter("updateUserName")) {
            setFieldValByName("updateUserName", ssoLoginUser.getUserName(), metaObject);
        }
    }

}